package com.ssy.lingxi.platform.manage.util;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author yzc
 * @version 2.0.0
 * @date 2020/11/19
 */
public class AcTrieNode {

    /**
     * 节点在list中的索引
     */
    public int index;
    /**
     * 深度, 0
     */
    public int depth;
    /**
     * 模式串末尾字符标识, false
     */
    public boolean end;
    /**
     * 模式串末尾节点记录keyword的索引
     */
    public List<Integer> results;
    /**
     * 节点的字符
     */
    public char ch;
    /**
     * 子节点映射, 字符-节点
     */
    public Map<Character, AcTrieNode> children;
    /**
     * 失败回溯节点
     */
    public AcTrieNode fail;
    /**
     * 父节点
     */
    public AcTrieNode parent;


    public AcTrieNode() {
        children = new HashMap<>();
        results = new ArrayList<>();
    }

    /**
     * 添加子节点并返回
     * @param c
     * @return
     */
    public AcTrieNode add(final Character c) {
        // 如果子节点已存在则返回该节点
        if (children.containsKey(c)) {
            return children.get(c);
        }

        // 新建子节点
        final AcTrieNode node = new AcTrieNode();
        // 保存节点信息
        node.parent = this;
        node.ch = c;
        // 建立字符与节点映射
        children.put(c, node);
        // 返回子节点
        return node;
    }

    public void setResults(final Integer index) {
        if (!end) {
            end = true;
        }
        if (!results.contains(index)) {
            results.add(index);
        }
    }

}
